package com.cssiot.scala.basic


/*类（class）
声明类（一个源文件中可以包含很多类，并且都是public级别）
getter和setter
构造函数（primary constructor & auxiliary constructor）
继承（extends）
重写父类方法（override def）
重写字段（override val，override var）

抽象类(abstract class)
类的一个或者多个方法没有没完整的定义
声明抽象方法不需要加abstract关键字，只需要不写方法体
子类重写父类的抽象方法时不需要加override
父类可以声明抽象字段（没有初始值的字段）
子类重写父类的抽象字段时不需要加override
* */

class Test extends ConsoleLogger{
    def test{
        log("PPP")
    }
}


trait ConsoleLogger{
    def log(msg : String){
        println("save money:" + msg)
    }
}


trait MessageLogger extends ConsoleLogger{
    override def log(msg : String){
        println("save money to bank :" + msg)
    }
}


abstract class Account{
    def save
}


class MyAccount extends Account with ConsoleLogger{
    def save{
        log("100")
    }
}


object Basic3 extends App{
    val t = new Test
    t.test
    
    val acc = new MyAccount with MessageLogger
    acc.save

}


/*特质(trait)-对比下JAVA8的接口
字段和行为的集合
混入类中
通过with关键字，一个类可以扩展多个特质*/


/*trait续
当做接口
带有具体实现的接口
带有特质的对象
特质从左到右被构造*/


/*apply方法
单例对象*/
class ApplyTest{
      def test{
      println("test")
    }
}